package com.example;

/**
 * 案例四：数字加密
 */
public class Test4 {
    public static void main(String[] args) {
        // 需求：某系统的数字密码是一个四位数,如1983,为了安全,需要加密后再传输
        // 加密规则是:对密码中的每位数都加5,再对10求余,最后将所有数字顺序反转,得到一串加密后的新数,请设计出满足本需求的加密程序!
        /*
        思路分析：
        1.定义三个方法解决 分别是拆分split 反转reverse 加密encrypt
         */
         System.out.println("加密后的密码是：" + encrypt(1983));
    }

    /**
     * 加密方法
     *
     * @param number 输入的数字
     * @return 返回加密后的字符串
     */
    public static String encrypt(int number) {
        // 定义一个Sting类型的遍历存储加密后的结果
        String result = "";

        // 调用拆分方法,把传入的四位数转成数组
        int[] numbers = split(number);

        // 遍历数组,对每一位数都进行加密
        for (int i = 0; i < numbers.length; i++) {
            // 加密规则是:对密码中的每位数都加5,再对10求余
            numbers[i] = (numbers[i] + 5) % 10;
        }

        // 反转数组
        reverse(numbers);

        // 遍历数组,把每一位拼接成字符串
        for (int i = 0; i < numbers.length; i++) {
            result += numbers[i];
        }

        return result;
    }

    /**
     * 反转数组
     *
     * @param numbers 传入的数组
     */
    public static void reverse(int[] numbers) {
        for (int i = 0, j = numbers.length - 1; i < j; i++, j--) {
            int temp = numbers[i];
            numbers[i] = numbers[j];
            numbers[j] = temp;
        }
    }

    /**
     * 把输入的数字转换为数组
     *
     * @param n 输入的数字
     * @return 输入的数字转换为数组
     */
    public static int[] split(int n) {
        int[] number = new int[4];
        // 获取个位,十位,百位,千位,存入到数组中 数组的第一个元素是千位,以此类推
        // 因为我们明确的知道是一个四位数,所以直接存放即可
        number[0] = n / 1000 % 10;
        number[1] = n / 100 % 10;
        number[2] = n / 10 % 10;
        number[3] = n % 10;
        return number;
    }
}
